package com.dys;

import com.dys.util.DatabaseUtils;

import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * @className: com.dys.JdbcDate
 * @description: 时间类型处理-接收时间类型数据
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/09/13 下午7:20
 */
public class JdbcDate {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) throws SQLException {
        testTimeStamp();
    }

    /**
     * 数据库使用Date,Java使用java.util.Date接收
     *
     * @throws SQLException
     */
    public static void testUtilDte() throws SQLException {
        // 1.获取连接对象
        Connection conn = DatabaseUtils.getConnection();
        // 2.准备查询User信息的SQL语句
        String sql = "select * from person where id = ?";
        // 3.获取PreparedStatement，传入SQL
        PreparedStatement ps = conn.prepareStatement(sql);
        // 4.给占位符赋值
        ps.setInt(1, 1);
        // 5.执行SQL，获取ResultSet返回结果
        ResultSet rs = ps.executeQuery();
        // 6.遍历ResultSet结果，封装到User
        while (rs.next()) {
            Date dateOfBirth = rs.getDate("date_of_birth");
            System.out.println("Date类型：" + dateOfBirth);
            String dateStr = rs.getString("date_of_birth");
            System.out.println("String类型：" + dateStr);
            java.util.Date dateOfBirth1 = (java.util.Date) rs.getObject("date_of_birth");
            LocalDate localDate = dateOfBirth.toLocalDate();
            System.out.println("java.sql.Date转为LocalDate: " + localDate);
            System.out.println("Object类型：" + dateOfBirth1);
        }
        // 7.释放资源
        DatabaseUtils.closeAll(conn, ps, rs);
    }

    /**
     * mysql使用datetime,Java使用LocalDateTime
     *
     * @throws SQLException
     */
    public static void testLocalDateTime() throws SQLException {
        // 1.获取连接对象
        Connection conn = DatabaseUtils.getConnection();
        // 2.准备查询User信息的SQL语句
        String sql = "select * from person where id = ?";
        // 3.获取PreparedStatement，传入SQL
        PreparedStatement ps = conn.prepareStatement(sql);
        // 4.给占位符赋值
        ps.setInt(1, 1);
        // 5.执行SQL，获取ResultSet返回结果
        ResultSet rs = ps.executeQuery();
        // 6.遍历ResultSet结果，封装到User
        while (rs.next()) {
            Date dateOfBirth = rs.getDate("date_of_birth");
            System.out.println("Date类型：" + dateOfBirth);
            String dateStr = rs.getString("date_of_birth");
            System.out.println("String类型：" + dateStr);
            // 在MySQL8.0.23以上版本，才会返回LocalDateTime类型，低于8.0.23版本返回的TimeStamp类型
            LocalDateTime dateOfBirth1 = (LocalDateTime) rs.getObject("date_of_birth");
            System.out.println("Object类型：" + dateOfBirth1);
        }
        // 7.释放资源
        DatabaseUtils.closeAll(conn, ps, rs);
    }

    /**
     * mysql使用timestamp类型,Java使用Timestamp
     *
     * @throws SQLException
     */
    public static void testTimeStamp() throws SQLException {
        // 1.获取连接对象
        Connection conn = DatabaseUtils.getConnection();
        // 2.准备查询User信息的SQL语句
        String sql = "select * from person where id = ?";
        // 3.获取PreparedStatement，传入SQL
        PreparedStatement ps = conn.prepareStatement(sql);
        // 4.给占位符赋值
        ps.setInt(1, 1);
        // 5.执行SQL，获取ResultSet返回结果
        ResultSet rs = ps.executeQuery();
        // 6.遍历ResultSet结果，封装到User
        while (rs.next()) {
            Date dateOfBirth = rs.getDate("date_of_birth");
            System.out.println("Date类型：" + dateOfBirth);
            String dateStr = rs.getString("date_of_birth");
            System.out.println("String类型：" + dateStr);
            // 在MySQL8.0.23以上版本，才会返回LocalDateTime类型，低于8.0.23版本返回的TimeStamp类型
            Timestamp dateOfBirth1 = (Timestamp) rs.getObject("date_of_birth");
            LocalDateTime localDateTime = dateOfBirth1.toLocalDateTime();
            System.out.println("Object类型：" + localDateTime);
        }
        // 7.释放资源
        DatabaseUtils.closeAll(conn, ps, rs);
    }
}
